home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / files / articulo.t06 < prev    next >
Encoding:
Text File  |  1996-11-14  |  11.2 KB  |  207 lines

  1. ε      Curso de assembler (IV)π
  2.  
  3.   Vamos a continuar en esta nueva entrega con algo más fuertecillo... después
  4. de presentar el δA86π (incluido en este número), daremos un profundo repaso a
  5. las principales interrupciones para luego poder iniciar proyectos más
  6. complejos. Pero empezemos corrigiendo los programitas que puse el pasado dia:
  7.  
  8. Γ MOV     AX, 100  ; AX=100π
  9. Γ MOV     BX, 200  ; BX=200π
  10. Γ ADD     AX, BX   ; AX=300π
  11. Γ MUL     BX       ; DX:AX=200*300=60000π
  12.  
  13.   Este era un ejemplo muy sencillo que no tenia ningún tipo de error ni
  14. complicación más allá de lo normal. El próximo os ha dado problemas a alguno
  15. pues lo intentasteis compilar y no os dejó:
  16.  
  17. Γ MOV     AX, 30   ; AX=30π
  18. Γ MOV     BX, 10   ; BX=10π
  19. Γ MUL     BX       ; DX:AX=30*10=300π
  20. Γ DIV     BX       ; DX=0 AX=30     π
  21. Γ ADD     AL, BX   ; ERROR!!!       π
  22.  
  23.   La última instrucción da un error de compilación ya que no se puede sumar
  24. un número de 8 bits con otro de 16. El último de los problemitas tampoco se
  25. podia compilar por varios errores:
  26.  
  27. Γ MOV     AL, 500  ; ERROR!!!π
  28. Γ MOV     BL, 100  ; BL=100  π
  29. Γ SUB     AL, BL   ; AL=AL-100π
  30. Γ MUL     10       ; ERROR!!! π
  31.  
  32.   En la primera línea ya nos encontramos un error bastante gordo, pero muy
  33. frequente al principio que consiste en tratar de meter en un registro de 8
  34. bits (en este caso) un valor de más bits (al menos 9 para el 500). La solución
  35. seria usar AX que puede representar hasta 16 bits. El otro error que aparece
  36. es la multiplicación que se intenta hacer en la última línea y que es ilegal
  37. ya que no podemos multiplicar por un valor constante.
  38.  
  39. ε      El ensamblador A86π
  40.  
  41.   El δA86π es un ensamblador shareware que nos permitirá crear código para el
  42. procesador 8086 que es el que estamos "estudiando" aquí. No se trata de un
  43. ensamblador completísimo, con miles de opciones para hacer virguerias, es un
  44. programita de lo más simple en el mundo de los ensambladores, pero esa sim-
  45. plicidad, lejos de hacerlo inferior, provoca que se use siempre que se desee
  46. hacer un programita rápido.
  47.   Lo usaremos durante unos meses ya que durante la fase de aprendizaje es mejor
  48. dejarse de complicaciones, por lo que seria recomendable que si dominas el
  49. inglés te leas los manuales que, por cierto, llevan un curso básico de assem-
  50. bler. Tambien deberias de registrarte si te gusta y lo vas a usar, aunque yo
  51. no creo que lo hagas... como todos.  :)
  52.   Vamos con la sintáxis. ¿Recordais los programitas de antes? Pues podeis
  53. probar a teclearlos y ensamblarlos... no hace falta que le digais nada más,
  54. el assembler lo ha sobre-entendido todo. Como ejemplo he metido un archivo
  55. llamado 'δaritmet1.asmπ' en el directorio '∞ASMπ' que podeis compilar y luego
  56. debuggear con el própio 'δdebugπ' del DOS.
  57.   Como podreis observar, el δA86π es tan simple que consta de un sólo ejecuta-
  58. ble que podeis incluso (por su reducido tamaño) copiar al directorio del DOS o
  59. si no lo preferiis poner en la variable δPATHπ del sistema la ruta hasta donde
  60. se encuentra dicho fichero. Además del δA86π, existe un debugger llamado D86 y
  61. creado por la misma persona que lee los ficheros δ.SYMπ generados y nos ayuda
  62. a debuggear (tal vez en próximos números se incluya el δD86π).
  63.   Los comentarios en el δA86π, como en todos los ensambladores, consisten en un
  64. punto y coma y de ahí a final de línea es ignorado. Hay unas cuantas directivas
  65. para el ensamblador que no veremos si no nos son necesarias y de las que po-
  66. dreis ver una referencia en los δ.DOCπ que se adjuntan. Otra cosita bastante
  67. simple del A86 son las etiquetas, una etiqueta es cualquier secuencia de carac-
  68. teres válida acabada en 'Γ:π' (dos puntos). Un ejemplo de uso de etiquetas lo
  69. podeis ver en 'δaritmet2.asmπ' que es un ejemplo algo más complejo que estu-
  70. diaremos ahora enseguida.
  71.  
  72. ε      Instrucciones de bifurcaciónπ
  73.  
  74.   Tras ese pomposo nombre se esconden ni más ni menos que los saltos que se
  75. producen durante la ejecución del programa. Está clarísimo que no se puede
  76. programar de forma lineal y por tanto el procesador ha de proporcionarnos una
  77. forma de hacer que el programa siga su curso por otro camino que no sea la
  78. línea recta. Las causas de salto pueden ser: interrupciones (tanto software
  79. como hardware), llamadas a subrutinas, saltos condicionales y saltos
  80. incondicionales. Vamos a ver, por orden inverso, los saltitos:
  81.     Los saltos incondicionales son los que produce el programador para cambiar
  82. la ejecución del programa a otro punto por la razón que sea. La instrucción
  83. que se encarga de hacerlo es ΓJMPπ que es el acrónimo de ∞JUMPπ (salto). Vamos
  84. con el ejemplo:
  85.  
  86. Γ   MOV  AX, 100     [1]π
  87. Γ   MOV  BX, 200     [2]π
  88. Γ   JMP  Suma        [3]π
  89. Γ Fin:               [4]π
  90. Γ   MOV  AX,4C00h    [5]π
  91. Γ   INT  21h         [6]π
  92. Γ Suma:              [7]π
  93. Γ   ADD  AX, BX      [8]π
  94. Γ   JMP  Fin         [9]π
  95.  
  96.  Este sencillísimo código lo que hace es primero guardar 2 valores inmediatos
  97. en ΓAXπ y ΓBXπ (lineas 1 y 2), luego saltar con la instrucción ∞JMPπ a la eti-
  98. queta 'δSumaπ' que se encuentra en la línea 7, se suman los números y se salta
  99. a la línea 4 donde se ejecutan las 2 líneas que terminan la ejecución de los
  100. programas.
  101.  Como podrás ver, la instrucción δJMPπ es el δGOTOπ de Basic, C, Pascal y tan-
  102. tos lenguajes de alto nivel que siempre nos prohibieron usar (pero que aquí es
  103. lo único que se puede emplear para determinadas cosas).
  104.     Los saltos condicionales son un tipo especial de salto que se ejecutan se-
  105. gún el estado que la anterior instrucción haya dejado en el registro de flags
  106. o banderas. Antes de nada, el registro de estado (de flags o como te de la ga-
  107. na), es un registro que no se debe modificar y que guarda información de la
  108. ejecución de la última instrucción, bueno, no exactamente la última, la última
  109. que haya modificado el registro de estado, es decir, algunas lo modifican y
  110. otras no (en general lo modifican las que pasan pasan por la δALUπ, las aritmé-
  111. ticas). Este registro guarda información sobre como si, por ejemplo, los dos
  112. registros implicados en una resta han dado resultado cero, o negativo, etc.
  113. Bueno, veamos un ejemplo y luego sigo:
  114.  
  115. Γ   MOV  AX, 40          [ 1]π
  116. Γ   MOV  BX, 20          [ 2]π
  117. Γ   SUB  AX, BX          [ 3] π
  118. Γ   JZ   Fin             [ 4] π
  119. Γ   SUB  AX, BX          [ 5] π
  120. Γ   JZ   Fin2            [ 6] π
  121. Γ Fin:                   [ 7] π
  122. Γ   MOV  AX, 4C00h       [ 8] π
  123. Γ   INT  21h             [ 9] π
  124. Γ Fin2:                  [10] π
  125. Γ   JMP  Fin             [11] π
  126.  
  127.  En el ejemplo lo primero que se hace es poner en δAXπ y δBXπ los valores ini-
  128. ciales, luego se hace la resta δAX-BXπ que da como resultado ΓAX=40-20=20π y
  129. en el registro de estado se pone el bit correspondiente como que el resultado
  130. φNOπ es cero. En la línea 4 aparece la primera línea de salto condicional que
  131. viene a decir aproximadamente "Σsi el resultado de la operación 'ΓSUB AX,BXΣ'π
  132. Σera 0, entoces saltar a 'ΓFinΣ', en otro caso, continuar por la siguiente lí-π
  133. Σnea (5)π". Como el resultado no habia dado 0, no se salta y se continua con la
  134. ejecución de la línea 5 que es otra resta, pero que en esta ocasión, sí resulta
  135. ser cero. La línea 6 es análoga a la 4, pero resulta que la anterior instruc-
  136. ción sí habia dado como resultado 0 y por tanto habrá que saltar a la etiqueta
  137. 'ΓFin2π'. La etiqueta 'ΓFin2π' nos lleva a la instrucción 'ΓJMP Finπ' que salta
  138. incondicionalmente a la línea 7 donde se termina el programa con las típicas
  139. instrucciones.
  140.  Muchas veces, nos interesará saltar si 2 registros son iguales, pero no que-
  141. rremos perder el contenido de uno de ellos, para esto hay una instrucción que
  142. es ΓCMPπ y que es el acrónimo de COMPARE. Básicamente lo que hace es restar los
  143. 2 registros que se indiquen, pero sin escribir el resultado en el destino. Como
  144. te podrás imaginar, para saber si los 2 registros son iguales, hay que mirar
  145. si despues de restarlos el resultado es 0 (con el bit de cero del registro de
  146. flags). La lista completa de instrucciones de salto condicional ya las veremos,
  147. pero las más importantes son (aunque algunas como δJZπ y δJEπ sean iguales):
  148. Γ   JZ  ->  si ceroπ
  149. Γ   JE  ->  si igualesπ
  150. Γ   JC  ->  si lleva acarreoπ
  151. Γ   JB  ->  si menor que    π
  152. Γ   JA  ->  si mayor que    π
  153. Γ   JS  ->  si es negativo  π
  154.  NOTA: Se puede intercalar la letra 'ßNπ' para indicar negación, por ejemplo,
  155.        ΓJEπ salta si son iguales y ΓJNEπ salta si no son iguales.
  156.     Las llamadas a subrutinas son el tercer tipo de salto que veremos. Se usa
  157. la instrucción ΓCALLπ (llamar) seguida por una etiqueta y es equivalente a la
  158. instrucción de δBASICπ (o otros lenguajes lineales) ΓGOSUBπ. Lo que se hace internamente
  159. es muy importante e interesante, pero no lo veremos hasta que sepamos que es
  160. la pila. En este número sólo veremos un ejemplo y dejaré para más adelante el
  161. estudio concienzudo de los subprogramas:
  162.  
  163. Γ  MOV  AX, 100   ;  Inicializamos AX y BXπ
  164. Γ  MOV  BX, 80    ; a un valor cualquiera.π
  165. Γ  CALL Suma      ;  Llamamos a Suma.     π
  166. Γ  MOV  AX, 4C00h ;  En DX ahora tendremos laπ
  167. Γ  INT  21h       ; suma de AX y BX.         π
  168. Γ Suma:                                      π
  169. Γ  MOV  DX, AX    ;  Subprograma para sumar 2π
  170. Γ  ADD  DX, BX    ; números.                 π
  171. Γ  RET            ;  Instrucción para regresarπ
  172.  
  173.     El último tipo de bifurcaciones son las interrupciones. Básicamente se
  174. trata de subprogramas predefinidos a los que se llama para realizar una tarea
  175. en concreto (mostrar un mensaje, salir al DOS, etc). No me extenderé más en
  176. esto ya que en el pasado número ya tuvisteis el primer contacto y más adelante
  177. tendreis otro contacto.
  178.   Con estos saltos que habeis podido ver, el programador ya puede empezar a
  179. estructurar sus programas tal como lo hacia con los δHLLπ y compactar aún más
  180. sus programas. Recomendaria que los programitas de ejemplo que he mostrado,
  181. los compilarais y los ejecutarais paso a paso para ver por donde va el curso
  182. de instrucciones en cada momento.
  183.  
  184. ε      Las principales interrupcionesπ
  185.  
  186.   Como hay muchas interrupciones para hacer muy variadas cosas, lo mejor es
  187. que consigais la lista de δRalf Brownπ o algo similar y busqueis la interrupción
  188. adecuada para lo que vayais a hacer. Por ejemplo, si necesitais abrir ficheros
  189. y manejar su contenido, le deciis al programa que busque "Γopen fileπ" o algo
  190. por el estilo y encontrareis un servicio (Ω3Dhπ) dentro de la δINT 21hπ que os
  191. permitirá abrir ficheros. A partir de este, mirais los servicios asociados y
  192. encontrareis como cerrar el fichero (Ω3Ehπ), como posicionarte (Ω42hπ), etc.
  193.   Iba a hacer una lista de los mejores, pero como seguro que todos teneis o
  194. podeis conseguir la lista esta de R.B. pues no lo he hecho. De todas formas si
  195. teneis problemas encontrandola o no os aclarais con alguna interrupción, no
  196. dudeis en preguntar. Para que tengais unos ejemplos más, os he incluido un
  197. sencillo código que lo que hace es decir si existe o no un fichero. Prueba a
  198. crear y eliminar el fichero y debuggea el programa para ver que hace en cada
  199. instante.
  200.  
  201.    Como el tiempo apremia por culpa de los malditos exámenes, no he podido
  202. hacer más ejemplos ni explicar las instrucciones lógicas, pero en el próximo
  203. número seguro que tendreis mucha más chicha que en este... practicad mucho y
  204. no seais malos (=no programeis en Visual Basic :)
  205.  
  206.                                                        ∞ Navi Dj.π
  207.